#include <iostream>
#include <vector>
#include <fstream>
#include <algorithm>
#include <sstream>
using namespace std;
bool isValid(string s)//判断每一段是否合法。
{
    if(s.size() > 1 && s[0] == '0')//如果首位为0，则IP地址不合法。
        return false;
    int res = atoi(s.c_str());//将字符型的数组转化为数字型数组。
    return res <= 255 && res >= 0;
}
 
void DFS(string s, string tmp, int num, vector<string> &result)
{
    if(num == 3 && isValid(s))//递归结束条件。
    {
        result.push_back(tmp+s);//每完成一个结果就将结果加入到容器中。
        return;
    }
 
    //可以取1-3个字符
    for(int i = 1; i <= 3 && i < s.size(); ++i) //特别需要注意i<s.size()
    {
        string subs = s.substr(0, i);//顺序获取s中长度为i的字符串。
        if(isValid(subs))//如果这段合法，递归寻找下一段，直到所有4段都完成，即num=3，否则这一段位数加一再进行尝试。
            DFS(s.substr(i), tmp+subs+".", num+1, result);
    }
}
 
int main()
{
 
    string s;
    cout<<"请输入任意数字串: "<<endl;
    while(cin >> s)
    {
        vector<string> result;
 
        if(s.size() < 4 || s.size() > 12)//不符合IP地址要求
        {
            cout<<"输入IP地址不合法"<<endl;
            return 0;
        }
        DFS(s, "", 0, result);
 
        cout<<"共有"<<result.size()<<"个合法结果: "<<endl;
        for(int i = 0; i < result.size(); ++i)
        {
            cout<<"第"<<i+1<<"个结果为：";
            cout << result[i] << endl;
        }
 
    }
 
 
    return 0;
}